/**
 * 当前div的滚动条滚动到底部事件
 * @param  {Function} fn 到底的回调时间
 * @return {[type]}      [description]
 */
export var scrollbottom = function (fn) {
  this.el.addEventListener('scroll', function (e) {
    var box = this
    var doms = box.childNodes
    var domsHeight = 0
    for (var i = 0; i < doms.length; i++) {
      if (doms[i].nodeName !== '#text') {
        domsHeight += doms[i].clientHeight
      }
    }
    if (box.scrollTop >= domsHeight - box.clientHeight) {
      fn()
    }
  }, false)
}

/**
 * 当前dom高度自动变化 下方剩余多少空间高度自动撑满
 * 注意次dom下面不能再有文档流中的dom 否则将被挤到页面可视区域的下方
 * @param  {Function} fn 到底的回调时间
 * @return {[type]}      [description]
 */
export var heightauto = function () {
  var dom = this.el
  setTimeout(function () {
    dom.style.height = (window.innerHeight - dom.offsetTop) + 'px'
  }, 400)
}

/**
 * 左滑出现右边的隐藏按钮
 * @return {[type]} [description]
 */
export var leftswipe = function (canSwipe) {
  if (canSwipe !== false) {
    canSwipe = true
  }
  setTimeout(() => {
    var el = this.el
    var touchDoms = document.getElementsByClassName(this.el.className)
    var deleteBox = this.el.nextElementSibling
    var deleteBoxWidth = deleteBox.clientWidth

    var stateObj = {
      el: el,
      touchDoms: touchDoms,
      closeAll (fn) {
        clearTimeout(this.tid)
        this.tid = setTimeout(() => {
          for (var i = 0; i < touchDoms.length; i++) {
            touchDoms[i].parentElement.style.webkitTransform = 'translate3d(0,0,0)'
          }
          fn && fn()
        }, 20)
      }
    }
    if (!canSwipe) {
      stateObj.closeAll()
    }
    window.touch.on(touchDoms, 'swiperight', function (ev) {
      if (canSwipe) {
        ev.preventDefault()
        stateObj.closeAll(() => {
          this.parentElement.style.webkitTransform = 'translate3d(0,0,0)'
        })
      }
    })
    window.touch.on(touchDoms, 'swipeleft', function (ev) {
      if (canSwipe) {
        ev.preventDefault()
        stateObj.closeAll(() => {
          this.parentElement.style.webkitTransform = 'translate3d(-' + deleteBoxWidth + 'px,0,0)'
        })
      }
    })
  }, 0)
}

/**
 * 封装touch.js的事件
 * @type {Object}
 */
export var ev = {
  // params: ['param'],
  acceptStatement: false, // 传入的参数不允许是个表达式
  update: function (arr) {
    if (!(arr instanceof Array)) {
      console.warn('v-ev传入的参数必须是个数组，第一个参数是已经在methods定义的函数，后面跟的是当前这个函数需要的参数，当前传入的' + this.expression + '不是一个数组！')
      return
    }
    var nativeEventArr = ['scroll']
    var _this = this
    var dom = this.el // 当前的dom元素
    var self = this.vm // 当前的上下文viewModel
    var expression = this.expression.replace(/\[|\]/g, '').split(',') // 指令的表达式 就是后面括号的内容的字符串
    var arg = this.arg // 指令的参数 冒号后面那个
    // var modifiers = this.modifiers // 当前事件的修饰符
    // console.log('params:' + arr) // 引号内参数的实际值
    // console.log(this.params) // 其他参数  这个dom上面v-bind绑定的参数  需要在上面的params属性内指定
    // console.log('modifiers' + JSON.stringify(modifiers)) // 当前事件的修饰符
    // // console.log('descriptor' + JSON.stringify(this.descriptor)) // 当前指令的解析结果
    // arr[0](arr[1])
    // console.log(self)
    // console.log(dom)
    // console.log('expression:' + expression)
    // console.log('arg' + arg)
    // console.log('------------------------------------------')

    // 阻止默认事件
    if (this.modifiers.prevent) {
      touch.on(dom, 'touchstart', function (e) {
        e.preventDefault()
      })
    }

    if (nativeEventArr.indexOf(this.arg) >= 0) {
      // 绑定原生事件
      bindNativeEvent()
    } else {
      // 绑定touch.js提供的事件
      bindTouchEvent()
    }

    /**
     * 绑定原生的事件
     * @return {[type]} [description]
     */
    function bindNativeEvent () {
      dom.addEventListener(arg, function (e) {
        try {
          var paramsArr = [].concat(arr) // 这里是闭包 变量会缓存着 所以不能直接操作arr  不然下次操作arr的时候arr已经变了
          // 判断当前方法是否存在
          paramsArr.push(e)
          if (self[expression[0]] && typeof paramsArr[0] === 'function') {
            var fn = paramsArr.splice(0, 1)[0]
            fn.apply(self, paramsArr)
          } else {
            if (self[expression[0]]) {
              if (typeof paramsArr[0] === 'function') {
                expression[0] + '方法存在异常'
              } else {
                console.warn(expression[0] + '方法不存在，请在methods中定义')
              }
            }
          }
        } catch (err) {
          console.warn(err)
        }
      }, _this.modifiers.stop)
    }
    /**
     * 绑定touch.js提供的事件
     * @return {[type]} [description]
     */
    function bindTouchEvent () {
      try {
        touch.on(dom, arg, function (e) {
          var paramsArr = [].concat(arr) // 这里是闭包 变量会缓存着 所以不能直接操作arr  不然下次操作arr的时候arr已经变了
          // 停止事件传播
          if (_this.modifiers.stop) {
            // touch.on(dom, 'touchstart', function (e) {
            //   e.stopPropagation()
            // })
            e.stopPropagation()
          }
          // 判断当前方法是否存在
          paramsArr.push(e)
          if (self[expression[0]] && typeof paramsArr[0] === 'function') {
            var fn = paramsArr.splice(0, 1)[0]
            fn.apply(self, paramsArr)
          } else {
            if (self[expression[0]]) {
              if (typeof paramsArr[0] === 'function') {
                expression[0] + '方法存在异常'
              } else {
                console.warn(expression[0] + '方法不存在，请在methods中定义')
              }
            }
          }
        })
      } catch (err) {
        console.warn(err)
      }
    }
  }
}
